EL FORMATO DEL FICHERO DE HABITACIÓN DE AETHERIA Un fichero de habitación de Aetheria corresponde a una habitación del mundo, la aplicación que relaciona ficheros con habitaciones es biyectiva. Un fichero de habitación es un archivo en formato de texto ASCII (estándar) cuya extensión es .ae (Aetheria Entity), como el resto de ficheros de entidades del mundo de Aetheria. El nombre del fichero ha de comenzar por 00 (de momento), ya que 0 es el código que indica que se trata de una habitación, y el segundo 0 indica que no pertenece a ninguna subclase de la clase habitación (como tienda, etc.) Después de esos dos dígitos 00, otros seis dígitos serán el identificador de la habitación, y si se quiere que el juego la cargue tienen que existir todos los ficheros con número anterior (por ejemplo, para que el juego cargue 00000382.ae tienen que existir ficheros para todas las habitaciones anteriores a la 382). Por lo demás, el orden que sigan los ficheros no tiene necesariamente que coincidir con ningún orden "geográfico" de las habitaciones. El contenido de un fichero de habitación es una serie de líneas, en el número que sea, que constan de: -Un número que identifica de qué tipo de línea se trata. -Un espacio para separar este número del resto. -La información de la línea, que depende del tipo de línea. Así, por ejemplo, un fichero de habitación puede ser éste: (nombre: 00000000.ae) 099 Mi primer fichero de habitación. 001 000000 003 0 004 Habitación vacía 010 0&0&No hay descripción de momento. LÍNEAS DEL FICHERO DE HABITACIÓN DE AETHERIA He aquí todas las que de momento existen, con su nombre. (*=dinámicas) (&=obligatorias) (?=no se sabe si la pondré) 000 ?roomtype 001 &idnumber 002 inherit 003*&state line 004 &title/name 010 &description list 011 &standard exits 012 other exits 020* object refs 021* mob refs 022* character refs 023* spell refs 030 extra descriptions 031 only restrictions 040 bitvectors 090 author 091 group 092 generated by 099 comment FORMATO DEL CONTENIDO DE LAS LÍNEAS Llamamos contenido de una línea a toda la información que contiene después del primer espacio, es decir, sin contar el número que identifica la línea. Su formato será diferente según el tipo de línea de que hablemos: 001 IDNUMBER (Obligatoria) Su formato es: Donde: "idnumber" es un número de seis dígitos que se corresponde con la ID de la habitación, es decir, los seis últimos dígitos del nombre del fichero. (para 00004812.ae, será 004812). Ejemplo de línea completa: 01 000011 99 (ID de habitación = 11) Los ceros a la izquierda no son realmente necesarios, aunque puedan clarificar. 002 INHERIT Si existe esta línea, nuestra habitación heredará todas las propiedades de otra habitación que ya hayamos cargado. Es decir que, por ejemplo, si queremos crear una habitación B exactamente igual que la habitación A que ya tenemos salvo por una línea, sólo tenemos que poner esa línea y una línea inherit que indique que se debe heredar de A. El juego leerá la habitación A y luego la sobreescribirá con los valores que indiquemos en B, que siempre tendrán preferencia. Hay ciertas líneas que no se heredan, que son la ID y todas las líneas dinámicas (estado y referencias). Las líneas obligatorias que no entren en este conjunto dejan de ser obligatorias si se van a heredar, es decir, si hacemos INHERIT poniendo una habitación que tiene título ya no tenemos por qué poner el título en la nueva, pues el título será heredado. Su formato es: Donde: "idnumber" es un número de ocho dígitos que se corresponde con la identificación (ID) completa de la habitación de la que se heredará. IMPORTANTE: la habitación de la que se hereda debe tener ID menor que la habitación heredera. Así se evitan ciclos en la herencia o herencias irregulares. Ejemplo: 01 000011 02 000010 011 (...) 099 La habitación 000011 será una copia exacta de la 000010 salvo por la línea 11, esta línea y otras que pueda tener. 003 STATE (Obligatoria) Es la línea que nos da el estado de la habitación. Su formato es: Donde: "state" es un entero de 32 bits en el que cada bit representa algún parámetro del estado. (...................) (...................) Ejemplo: 003 54 004 TITLE (Obligatoria) Línea que da el título de la habitación. Su formato es: Donde: "titlestring" es una frase corta que describe la habitación, por ejemplo, "Plaza Mayor" o "Claro en el bosque". El título no se mostrará normalmente en el juego y no tiene ningún valor identificador (es decir, dos habitaciones pueden tener el mismo título, pues no se identifican por él); pero debe ponerse un título que represente a la habitación para su mejor visualización en editores, por ejemplo, y para que se pueda mostrar en la depuración del juego. Ejemplo: 004 El dormitorio de Karen 010 DESCRIPTION LIST (Obligatoria) Línea con una lista de descripciones para la habitación según el estado en que se encuentre. Su formato es: &&(...)& Donde el formato de es: && Por lo tanto, el número de caracteres & en la lista tiene que ser de la forma 3n-2, y, evidentemente, el carácter & utilizado como separador no puede aparecer en el interior de ninguna descripción. Para saber cómo se han de organizar las descripciones unitarias, es necesario saber cómo funcionan y cuál es el significado de comparando y máscara. Cada descripción unitaria no es más que un trozo de descripción que se muestra estando la habitación en un determinado número de estado o estados (un solo estado, todos los estados, los estados de un cierto tipo, o incluso ningún estado, aunque esto último no tendría mucho sentido). Así, el proceso que sigue el juego a la hora de describir una habitación es: PARA I = O HASTA NUMERO_DESCRIPCIONES_UNITARIAS HACER SI ESTADO_HABITACION.CUMPLE_CONDICION_IMPUESTA_POR( COMPARANDO[I],MASCARA[I] ) ENTONCES SACAR POR PANTALLA DESCRIPCION_UNITARIA[I] Por supuesto, las descripciones se miran en orden. La condición impuesta al estado de la habitación por el comparando y la máscara es que los bits que sean 1 en la máscara sean iguales en el estado y en el comparando. Es decir, por ejemplo: una máscara de ceros significa que la condición se verificará siempre, sea cual sea el comparando, así que esa parte de la descripción se mostrará en cualquier caso. Una máscara de unos significa que se compara completamente con el comparando, es decir, sólo se mostrará la descripción si el estado de la habitación es exactamente el ahí especificado. Una máscara con un solo bit a uno significa que sólo se ha de comparar ese bit de estado. La lista de descripciones puede ser todo lo larga que sea necesario. He aquí un ejemplo donde se ve cómo se debe organizar la descripción y el tono y tiempo a utilizar: 010 0&64&Te hallas en una plaza de considerable tamaño. Una placa informa de que se trata de la Plaza Nueva de Aetheria.&64&64&Estás en la Plaza Nueva de Aetheria, la más oriental de las dos grandes plazas del centro de la ciudad.&0&0&Se ve a simple vista que la plaza dejó hace mucho tiempo de ser realmente "nueva". El pavimento es de piedra, y en el centro hay una fuente, también pétrea, cuya agua fluye con suave murmullo. La fuente está coronada por la estatua de un hombre alto, de mediana edad, que sostiene una pluma en una de sus manos y un pergamino en la otra. Al Oeste se alza la fachada trasera del edificio que unas grandes letras rojas identifican como "Ayuntamiento", y que cuenta con un gran arco que se puede atravesar para acceder a otra plaza, y encima del arco un gran reloj mecánico de esfera redonda y blanca. Al Norte parece comenzar una importante avenida, pavimentada con adoquines, mientras que al Sur hay una pequeña plazoleta. Al Este, un camino sin puertas o verjas de ningún tipo conduce a un verde jardín.&0&6&El agua de la alegre fuente brilla bajo la luz del sol.&2&6&El cielo está cubierto de nubes algodonosas.&4&6&El agua de lluvia se confunde y mezcla, al caer, con el de la fuente central.&1&1&La plaza está bien iluminada por una potente fuente de luz situada encima del sombrero de la estatua. 011 STANDARD EXITS (Obligatoria) Línea con una lista de las salidas estándar, especificando su destino, tiempo para atravesarlas, etc. Su formato es: @@@@@@@@@ Cada uno de los campos representa la salida que tiene la habitación en la dirección correspondiente. Estas salidas, a las que se accede por comandos como "ir norte", "ir al sur", etc. se denominan las salidas estándar de la habitación. Otras salidas, las personalizadas, serían cosas como "entrar en la casa", "salir", "ir por el arco", etc. y se ponen en la línea siguiente (012). Los campos deben estar ordenados como se especifica, pues el orden es la forma que tiene Aetheria de saber cuál es la salida hacia cada punto cardinal. Esto implica que tienen que aparecer necesariamente los diez campos; pero no necesariamente que toda habitación tenga que tener salida en las diez direcciones, pues un campo que se deje con destino a cero o a una letra se entenderá que corresponde a una salida inexistente. Se verá a continuación, con el formato del campo. El formato de cada campo de salida es: $$$$$ O bien: Donde: "destino" es un número, una ID de habitación, que especifica la habitación a la que se accederá por esa salida. "description_list" es una lista de descripciones de la salida, con comparando y máscara, en el mismo formato de lista de descripción explicado con la línea 010. En este caso, la descripción corresponde a la acción de caminar a través de la salida. "tiempo_salida" es el tiempo en TU's (unidades de tiempo) que se tarda en pasar de una habitación a otra. Es un número entero, no recomendable cero ni negativo. "peerable" es un flag que indica si se puede ver a través de esta salida. Si vale 1, significa que se puede ver desde esta habitación la habitación destino. "state" es el estado de la salida. Puede ser "item $+ nº" si depende de un item. "keyid" es una lista de números, IDs de objeto, correspondientes a las llaves que pueden abrir esta salida si está cerrada (cerrado o abierto especificado en el estado). -> lista con &. "destino_invalido" es el número 0 o una serie de caracteres no numéricos. Las salidas con este formato son salidas no permitidas (habitación que no tiene salida en esa dirección). Ejemplo: 011 0007$0&0&Te vas hacia el Norte por una amplia avenida.$30$0$0$0@0009$0&0&Te diriges hacia la plazuela que hay al Sur.$30$0$0$0@0004$0&0&Te diriges hacia el arco del Ayuntamiento.$30$0$0$0@0008$0&0&Caminas hacia el jardín al Este.$30$0$0$0@0@0@0@0@0@0 012 OTHER EXITS (Obligatoria) Línea con una lista de las salidas personalizadas, especificando su destino, tiempo para atravesarlas, etc. Su formato es: @@...@ Las salidas personalizadas son cualquier salida que se active con un comando diferente a norte, sur, este, oeste, nordeste, noroeste, sureste, suroeste, arriba o abajo. El formato New formats ----------- STANDARD destino - description list - tiempo salida [tok3] - peerable bit [tok4] - state word - key ID - associated object if any OTHER destino - description list - tiempo salida [tok3] - reference(command) list [tok4] - peerable bit - state word - key ID - associated object if any If a path (exit) has an associated object, then its state is associated object's state (ex. door state). Two exits (ex. east and exit and door) may have the same associated object.